前言
历史上,JavaScript 一直没有模块(module)体系,无法将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来。其他语言都有这项功能,比如 Ruby 的require、Python 的import,甚至就连 CSS 都有@import,但是 JavaScript 任何这方面的支持都没有,这对开发大型的、复杂的项目形成了巨大障碍。
今天来聊聊ES6中比较重要且使用的东西,也就是Module(模块),终于在ES6时,Javascript也具有模块化的功能,ES6中的Module具备着AMD和CMD的双重特性,也就是说,从ES6时代,我们可以告别SeaJs和requireJs了。
正文从这里开始,首先明确一点,ES6中的Module自动采用严格模式 (“use strict”),也就是说,采用ES6的模块机制必须遵循js的严格模式。
js的严格模式是ES5就发明的,这里不多说严格模式有哪些限制了。
Module功能主要由两个命令构成:export和import。export命令用于规定模块的对外接口,import命令用于输入其他模块提供的功能。
export
在javascript中,我们习惯把一个js文件当做一个模块,当然通过export输出
|
|
通常我们习惯这样使用export,把要输出的值放在一个对象集里。
export命令除了输出变量,还可以输出函数或类(class)。
通常情况下,export输出的变量就是本来的名字,但是可以使用as关键字重命名。
|
|
输出函数时还需要注意一点,必须用对象集包裹函数
export输出的内容并是不想象中静态的,实际上写个定时器,值还是会变得
|
|
import
使用export命令定义了模块的对外接口以后,其他 JS 文件就可以通过import命令加载这个模块。
|
|
如果想为输入的变量重新取一个名字,import命令要使用as关键字,将输入的变量重命名。
|
|
因为import是静态执行,所以import不支持运算
目前阶段,通过 Babel 转码,CommonJS 模块的require命令和 ES6 模块的import命令,可以写在同一个模块里面,但是最好不要这样做。因为import在静态解析阶段执行,所以它是一个模块之中最早执行的。下面的代码可能不会得到预期结果。
|
|
export default
从import来看,每一次引入时都需要知道前文件输出的名称是什么,为了给开发者的优秀体验,export default就是为了默认输出不命名出现的,
而引入时,可以随意起名字。
|
|
export default命令其实只是输出一个叫做default的变量,所以它后面不能跟变量声明语句。
export default 只能被使用一次,第二次使用会报错
import()
前文讲到过,因为import属于静态执行,无论写在哪里都会默认第一步执行。所以想达到像CMD一样的延时加载的效果,ES6也是有考虑到的,就要用到import()了
import()的一些使用场景
1、判断
2、按需加载
3、动态的模块路径
Module 的浏览器加载
在 HTML 网页中,浏览器通过